home *** CD-ROM | disk | FTP | other *** search
/ MacAddict 114 / macaddict114.cdr / Software / Utilities / macam.0.8.4.dmg / macam sources / app_specific / MyMovieWindowController.m < prev    next >
Encoding:
Text File  |  2003-01-09  |  6.1 KB  |  199 lines

  1. //
  2. //  MyMovieWindowController.m
  3. //  MovieTester
  4. //
  5. //  Created by Matthias Krauß on Fri Nov 01 2002.
  6. //  Copyright (c) 2002 __MyCompanyName__. All rights reserved.
  7. //
  8.  
  9. #import "MyMovieWindowController.h"
  10. #import "MyMovieDocument.h"
  11. #import "MyNSMovieExtensions.h"
  12.  
  13. @interface MyMovieWindowController (Private)
  14.  
  15. - (void) refreshPosition:(NSTimer*)timer;
  16. - (void) windowResized:(NSNotification*)notification;
  17.  
  18. @end
  19.  
  20. @implementation MyMovieWindowController
  21.  
  22. - (id)init {
  23.     BOOL ok;
  24.     self=[super init];
  25.     if (!self) return NULL;
  26.     ok=[NSBundle loadNibNamed:@"MyMovieDocument" owner:self];
  27.     if (!ok) {
  28.         [super dealloc];
  29.         return NULL;
  30.     }
  31.     return self;
  32. }
  33.  
  34. - (void) close {
  35.     [super close];
  36. }
  37.  
  38. - (void) setDocument:(NSDocument*)document {
  39.      NSRect inner=[movieViewContainer frame];
  40.      NSRect outer=[[movieViewContainer window] frame];
  41.      NSSize diff=NSMakeSize(outer.size.width-inner.size.width,outer.size.height-inner.size.height);
  42.      NSMovie* mov=[(MyMovieDocument*)document innerMovie];
  43.      NSSize natural=(mov)?[mov naturalSize]:NSMakeSize(0,0);
  44.      BOOL isVisible=(mov)?[mov isVisible]:NO;
  45.      BOOL isAudible=(mov)?[mov isAudible]:NO;
  46.  
  47.      //Forward movie to view
  48.      [movieView setMovie:mov];
  49.      [movieView gotoBeginning:NULL];
  50.  
  51.      [super setDocument:document];
  52.      if (document) {    //enable resize notifications to sync movieview with window
  53.          [movieViewContainer setPostsFrameChangedNotifications:YES];
  54.          [[NSNotificationCenter defaultCenter] addObserver:self
  55.                                                   selector:@selector(windowResized:)
  56.                                                       name:NSViewFrameDidChangeNotification
  57.                                                     object:movieViewContainer];
  58.          //Init control update timer (polling is bad, but we try to limit it to a minimum)
  59.          refreshPositionTimer=[NSTimer scheduledTimerWithTimeInterval:0.25f
  60.                                                                target:self
  61.                                                              selector:@selector(refreshPosition:)
  62.                                                              userInfo:NULL
  63.                                                               repeats:YES];
  64.      } else {
  65.          [refreshPositionTimer invalidate];
  66.          [[NSNotificationCenter defaultCenter] removeObserver:self];
  67.      }         
  68.  
  69.  
  70.      //Set appropriate window size
  71.      if ((natural.width)<300) natural.width=300;
  72.      outer.size=NSMakeSize(natural.width+diff.width,natural.height+diff.height);
  73.      [[movieView window] setFrame:outer display:YES];
  74.      if (!isVisible) {    //Limit window height resizing
  75.          NSSize min=[[self window] minSize];
  76.          NSSize max=[[self window] maxSize];
  77.          max.height=min.height;
  78.          [[self window] setMaxSize:max];
  79.      }
  80.      if (!isAudible) {    //Disable volume slider
  81.          [volumeSlider setFloatValue:0.0f];
  82.          [volumeSlider setEnabled:NO];
  83.      }
  84. }    
  85.  
  86. - (IBAction)gotoStart:(id)sender
  87. {
  88.     [movieView gotoBeginning:sender];
  89.     [self refreshPosition:refreshPositionTimer];
  90. }
  91.  
  92. - (IBAction)gotoEnd:(id)sender
  93. {
  94.     [movieView gotoEnd:sender];
  95.     [self refreshPosition:refreshPositionTimer];
  96. }
  97.  
  98. - (IBAction)pause:(id)sender
  99. {
  100.     [movieView stop:sender];
  101.     [self refreshPosition:refreshPositionTimer];
  102. }
  103.  
  104. - (IBAction)play:(id)sender
  105. {
  106.     [movieView start:sender];
  107.     [self refreshPosition:refreshPositionTimer];
  108. }
  109.  
  110. - (IBAction)stepForward:(id)sender
  111. {
  112.     [movieView stepForward:sender];
  113.     [self refreshPosition:refreshPositionTimer];
  114. }
  115.  
  116. - (IBAction)stepBackward:(id)sender
  117. {
  118.     [movieView stepBack:sender];
  119.     [self refreshPosition:refreshPositionTimer];
  120. }
  121.  
  122. - (IBAction)positionSliderChanged:(id)sender
  123. {
  124.     float pos=[positionSlider floatValue];
  125.     NSMovie* mov=[[self document] innerMovie];
  126.     [mov gotoSeconds:[mov totalSeconds]*pos];
  127.     [self refreshPosition:refreshPositionTimer];
  128. }
  129.  
  130. - (IBAction)speedSliderChanged:(id)sender {
  131.     [movieView setRate:[speedSlider floatValue]];
  132. }
  133.  
  134. - (IBAction)volumeSliderChanged:(id)sender {
  135.     [movieView setVolume:[volumeSlider floatValue]];
  136. }
  137.  
  138. - (IBAction)toggleTimeDisplay:(id)sender {
  139.     showRemaining=!showRemaining;
  140.     [self refreshPosition:refreshPositionTimer];
  141. }
  142.  
  143. - (void) windowResized:(NSNotification*)notification {
  144.     NSRect outerRect=[movieViewContainer bounds];
  145.     NSMovie* mov=[[self document] innerMovie];
  146.     if (mov) {
  147.         NSSize natural=[mov naturalSize];
  148.         float factor=0.0f;
  149.         NSRect innerRect;
  150.         if ((natural.width>0)&&(natural.height>0)) {
  151.             float factor1=outerRect.size.width/natural.width;
  152.             float factor2=outerRect.size.height/natural.height;
  153.             factor=MIN(factor1,factor2);
  154.         }
  155.         innerRect=NSMakeRect((outerRect.size.width-(factor*natural.width))/2.0,
  156.                    (outerRect.size.height-(factor*natural.height))/2.0,
  157.                    factor*natural.width,
  158.                    factor*natural.height);
  159.         [movieView setFrame:innerRect];
  160.     } else {
  161.         [movieView setFrame:outerRect];
  162.     }
  163. }
  164.  
  165. - (void) refreshPosition:(NSTimer*) timer {
  166.     int hours,minutes,seconds,frames;
  167.     NSMovie* mov=[[self document] innerMovie];
  168.     float secs=0.0f;
  169.     float total=0.0f;
  170.     BOOL isPlaying=NO;
  171.     if (mov) {
  172.         secs=[mov currentSeconds];
  173.         total=[mov totalSeconds];
  174.         isPlaying=[movieView isPlaying];
  175.     }
  176.     [positionSlider setFloatValue:secs/total];
  177.     if (showRemaining) {
  178.         secs=total-secs;
  179.         hours=(int)(secs/3600.0f);
  180.         minutes=((int)(secs/60.0f))%60;
  181.         seconds=((int)(secs))%60;
  182.         frames=((int)(secs*100.0f))%100;
  183.         [timeTextField setTitle:
  184.             [NSString stringWithFormat:@"- %i:%02i:%02i:%02i",hours,minutes,seconds,frames]];
  185.     } else {
  186.         hours=(int)(secs/3600.0f);
  187.         minutes=((int)(secs/60.0f))%60;
  188.         seconds=((int)(secs))%60;
  189.         frames=((int)(secs*100.0f))%100;
  190.         [timeTextField setTitle:
  191.             [NSString stringWithFormat:@"%i:%02i:%02i:%02i",hours,minutes,seconds,frames]];
  192.     }
  193.     [playButton setState:(isPlaying)?NSOnState:NSOffState];
  194.     [pauseButton setState:(isPlaying)?NSOffState:NSOnState];
  195. }
  196.  
  197.  
  198. @end
  199.